package com.jeff.android.lab.architecture.designpattern.singleton;

/**
 *
 * 1、实现代码简洁。和双重检查单例对比，静态内部类单例实现代码真的是太简洁，又清晰明了。
 * 2、延迟初始化。调用getSingleton才初始化Singleton对象。
 * 3、线程安全。JVM在执行类的初始化阶段，会获得一个可以同步多个线程对同一个类的初始化的锁。
 *
 * 如何实现线程安全？
 * 线程A和线程B同时试图获得Singleton对象的初始化锁，假设线程A获取到了，那么线程B一直等待初始化锁。线程A执行类初始化，就算双重检查模式中伪代码发生了重排序，
 * 也不会影响线程A的初始化结果。初始化完后，释放锁。线程B获得初始化锁，发现Singleton对象已经初始化完毕，释放锁，不进行初始化，获得Singleton对象。
 *
 * @author: dingfeng
 * @date: 2020-08-05
 * @since: 1.0.0
 **/
public class StaticInnerClassSingleton {

    private StaticInnerClassSingleton() {}

    private static class Inner {
        private final static StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getSingleton() {
        return Inner.instance;
    }

}
